package com.bestcem.xm.txtanls.grpc.convert;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.bestcem.xm.bi.grpc.v1.services.Column;
import com.bestcem.xm.txtanls.grpc.v1.enums.DataTypeEnum;
import com.bestcem.xm.txtanls.grpc.v1.services.Field;
import com.bestcem.xm.txtanls.service.dto.worktable.ColumnDTO;
import com.bestcem.xm.txtanls.service.dto.worktable.FieldDTO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

import static com.bestcem.xm.common.core.constant.Constants.DEFAULT_ARRAY_SIZE;

/**
 * @author liheng
 * @version v1.0
 * @date 2021/6/21 18:40
 */

public class ColumnConvert {
    private ColumnConvert() {
    }

    /**
     * grpc entity 转dto
     *
     * @param column grpc 列实体
     * @return dto
     */
    public static ColumnDTO convertToDTO(Column column) {
        ColumnDTO columnDTO = new ColumnDTO();
        columnDTO.setId(column.getId());
        columnDTO.setReadableCol(column.getReadablecol());
        columnDTO.setCol(column.getCol());
        columnDTO.setTType(column.getTtype().getNumber());
        columnDTO.setRawWorktableId(column.getRawWorktableId());
        return columnDTO;
    }


    /**
     * grpc entity list 转dto list
     *
     * @param columns grpc 列实体list
     * @return dto list
     */
    public static List<ColumnDTO> convertToDTOList(List<Column> columns) {
        if (CollUtil.isEmpty(columns)) {
            return Collections.emptyList();
        }
        List<ColumnDTO> columnDTOs = new ArrayList<>(DEFAULT_ARRAY_SIZE);
        for (Column column : columns) {
            columnDTOs.add(convertToDTO(column));
        }
        return columnDTOs;
    }

    /**
     * 列dto转字段信息dto
     *
     * @param columnDTO 列dto
     * @return 字段信息dto
     */
    public static FieldDTO columnToField(ColumnDTO columnDTO) {
        FieldDTO fieldDTO = new FieldDTO();
        if (StringUtils.isNotBlank(columnDTO.getId())) {
            fieldDTO.setId(columnDTO.getId());
        }
        if (StringUtils.isNotBlank(columnDTO.getReadableCol())) {
            fieldDTO.setName(columnDTO.getReadableCol());
        }
        if (Objects.nonNull(columnDTO.getDType())) {
            fieldDTO.setType(columnDTO.getDType());
        }
        return fieldDTO;
    }

    /**
     * 列dto list 转字段信息dto list
     *
     * @param columnDTOS 列dto list
     * @return 字段信息dto list
     */
    public static List<FieldDTO> columnToFieldList(List<ColumnDTO> columnDTOS) {
        if (CollectionUtils.isEmpty(columnDTOS)) {
            return Collections.emptyList();
        }
        List<FieldDTO> fieldDTOS = new ArrayList<>(columnDTOS.size());
        for (ColumnDTO column : columnDTOS) {
            if (Objects.isNull(column)) {
                continue;
            }
            fieldDTOS.add(columnToField(column));
        }
        return fieldDTOS;
    }

    /**
     * 字段信息dto转grpc entity
     *
     * @param fieldDTO 字段信息dto
     * @return grpc entity
     */
    public static Field dtoToField(FieldDTO fieldDTO) {
        Field.Builder builder = Field.newBuilder();
        if (ObjectUtil.isNotNull(fieldDTO.getId())) {
            builder.setId(fieldDTO.getId());
        }
        if (ObjectUtil.isNotNull(fieldDTO.getName())) {
            builder.setName(fieldDTO.getName());
        }
        if (ObjectUtil.isNotNull(fieldDTO.getType())) {
            builder.setType(DataTypeEnum.DataType.forNumber(fieldDTO.getType()));
        }
        return builder.build();
    }


    /**
     * 字段信息dto list转grpc entity list
     *
     * @param fieldDTOS 字段信息dto list
     * @return grpc entity list
     */
    public static List<Field> dtoToFieldList(List<FieldDTO> fieldDTOS) {
        ArrayList<Field> fields = new ArrayList<>(DEFAULT_ARRAY_SIZE);
        for (FieldDTO fieldDTO : fieldDTOS) {
            fields.add(dtoToField(fieldDTO));
        }
        return fields;
    }
}
